// This is a TextMate grammar distributed by `starry-night`.
// This grammar is licensed permissive.
// See <https://github.com/wooorm/starry-night> for more info.
/**
 * @import {Grammar} from '@wooorm/starry-night'
 */

/** @type {Grammar} */
const grammar = {
  extensions: ['.applescript', '.scpt'],
  names: ['applescript', 'osascript'],
  patterns: [{include: '#blocks'}, {include: '#inline'}],
  repository: {
    'attributes.considering-ignoring': {
      patterns: [
        {
          match: ',',
          name: 'punctuation.separator.array.attributes.applescript'
        },
        {
          match: '\\b(and)\\b',
          name: 'keyword.control.attributes.and.applescript'
        },
        {
          match:
            '\\b(?i:case|diacriticals|hyphens|numeric\\s+strings|punctuation|white\\s+space)\\b',
          name: 'constant.other.attributes.text.applescript'
        },
        {
          match: '\\b(?i:application\\s+responses)\\b',
          name: 'constant.other.attributes.application.applescript'
        }
      ]
    },
    blocks: {
      patterns: [
        {
          begin: '^\\s*(script)\\s+(\\w+)',
          beginCaptures: {
            1: {name: 'keyword.control.script.applescript'},
            2: {name: 'entity.name.type.script-object.applescript'}
          },
          end: '^\\s*(end(?:\\s+script)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.script.applescript'}},
          name: 'meta.block.script.applescript',
          patterns: [{include: '$self'}]
        },
        {
          begin:
            '^(?x)\n\t\t\t\t\t\t\\s*(to|on)\\s+ \t\t\t\t\t# "on" or "to"\n\t\t\t\t\t\t(\\w+)\t\t\t\t\t\t\t# function name\n\t\t\t\t\t\t(\\()\t\t\t\t\t\t\t# opening paren\n\t\t\t\t\t\t\t((?:[\\s,:\\{\\}]*(?:\\w+)?)*)\t# parameters\n\t\t\t\t\t\t(\\))\t\t\t\t\t\t\t# closing paren\n\t\t\t\t\t',
          beginCaptures: {
            1: {name: 'keyword.control.function.applescript'},
            2: {name: 'entity.name.function.handler.applescript'},
            3: {name: 'punctuation.definition.parameters.begin.applescript'},
            4: {name: 'variable.parameter.handler.applescript'},
            5: {name: 'punctuation.definition.parameters.end.applescript'}
          },
          end: '^\\s*(end)(?:\\s+(\\2))?(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.function.applescript'}},
          name: 'meta.function.positional.applescript',
          patterns: [{include: '$self'}]
        },
        {
          begin:
            '^(?x)\n\t\t\t\t\t\t\\s*(to|on)\\s+ \t\t\t\t\t# "on" or "to"\n\t\t\t\t\t\t(\\w+)\t\t\t\t\t\t\t# function name\n\t\t\t\t\t\t(?:\\s+\n\t\t\t\t\t\t\t(of|in)\\s+\t\t\t\t\t# "of" or "in"\n\t\t\t\t\t\t\t(\\w+)\t\t\t\t\t\t# direct parameter\n\t\t\t\t\t\t)?\n\t\t\t\t\t\t(?=\\s+(above|against|apart\\s+from|around|aside\\s+from|at|below|beneath|beside|between|by|for|from|instead\\s+of|into|on|onto|out\\s+of|over|thru|under)\\b)\n\t\t\t\t\t',
          beginCaptures: {
            1: {name: 'keyword.control.function.applescript'},
            2: {name: 'entity.name.function.handler.applescript'},
            3: {name: 'keyword.control.function.applescript'},
            4: {name: 'variable.parameter.handler.direct.applescript'}
          },
          end: '^\\s*(end)(?:\\s+(\\2))?(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.function.applescript'}},
          name: 'meta.function.prepositional.applescript',
          patterns: [
            {
              captures: {
                1: {name: 'keyword.control.preposition.applescript'},
                2: {name: 'variable.parameter.handler.applescript'}
              },
              match:
                '\\b(?i:above|against|apart\\s+from|around|aside\\s+from|at|below|beneath|beside|between|by|for|from|instead\\s+of|into|on|onto|out\\s+of|over|thru|under)\\s+(\\w+)\\b'
            },
            {include: '$self'}
          ]
        },
        {
          begin:
            '^(?x)\n\t\t\t\t\t\t\\s*(to|on)\\s+ \t\t\t\t\t# "on" or "to"\n\t\t\t\t\t\t(\\w+)\t\t\t\t\t\t\t# function name\n\t\t\t\t\t\t(?=\\s*(--.*?)?$)\t\t\t\t# nothing else\n\t\t\t\t\t',
          beginCaptures: {
            1: {name: 'keyword.control.function.applescript'},
            2: {name: 'entity.name.function.handler.applescript'}
          },
          end: '^\\s*(end)(?:\\s+(\\2))?(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.function.applescript'}},
          name: 'meta.function.parameterless.applescript',
          patterns: [{include: '$self'}]
        },
        {include: '#blocks.tell'},
        {include: '#blocks.repeat'},
        {include: '#blocks.statement'},
        {include: '#blocks.other'}
      ]
    },
    'blocks.other': {
      patterns: [
        {
          begin: '^\\s*(considering)\\b',
          end: '^\\s*(end(?:\\s+considering)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.considering.applescript',
          patterns: [
            {
              begin: '(?<=considering)',
              end: '(?<!¬)$',
              name: 'meta.array.attributes.considering.applescript',
              patterns: [{include: '#attributes.considering-ignoring'}]
            },
            {
              begin: '(?<=ignoring)',
              end: '(?<!¬)$',
              name: 'meta.array.attributes.ignoring.applescript',
              patterns: [{include: '#attributes.considering-ignoring'}]
            },
            {match: '\\b(but)\\b', name: 'keyword.control.but.applescript'},
            {include: '$self'}
          ]
        },
        {
          begin: '^\\s*(ignoring)\\b',
          end: '^\\s*(end(?:\\s+ignoring)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.ignoring.applescript',
          patterns: [
            {
              begin: '(?<=considering)',
              end: '(?<!¬)$',
              name: 'meta.array.attributes.considering.applescript',
              patterns: [{include: '#attributes.considering-ignoring'}]
            },
            {
              begin: '(?<=ignoring)',
              end: '(?<!¬)$',
              name: 'meta.array.attributes.ignoring.applescript',
              patterns: [{include: '#attributes.considering-ignoring'}]
            },
            {match: '\\b(but)\\b', name: 'keyword.control.but.applescript'},
            {include: '$self'}
          ]
        },
        {
          begin: '^\\s*(if)\\b',
          beginCaptures: {1: {name: 'keyword.control.if.applescript'}},
          end: '^\\s*(end(?:\\s+if)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.if.applescript',
          patterns: [
            {match: '\\b(then)\\b', name: 'keyword.control.then.applescript'},
            {
              match: '\\b(else\\s+if)\\b',
              name: 'keyword.control.else-if.applescript'
            },
            {match: '\\b(else)\\b', name: 'keyword.control.else.applescript'},
            {include: '$self'}
          ]
        },
        {
          begin: '^\\s*(try)\\b',
          beginCaptures: {1: {name: 'keyword.control.try.applescript'}},
          end: '^\\s*(end(?:\\s+(try|error))?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.try.applescript',
          patterns: [
            {
              begin: '^\\s*(on\\s+error)\\b',
              beginCaptures: {
                1: {name: 'keyword.control.exception.on-error.applescript'}
              },
              end: '(?<!¬)$',
              name: 'meta.property.error.applescript',
              patterns: [
                {
                  match: '\\b(?i:number|partial|from|to)\\b',
                  name: 'keyword.control.exception.modifier.applescript'
                },
                {include: '#inline'}
              ]
            },
            {include: '$self'}
          ]
        },
        {
          begin: '^\\s*(using\\s+terms\\s+from)\\b',
          beginCaptures: {1: {name: 'keyword.control.terms.applescript'}},
          end: '^\\s*(end(?:\\s+using\\s+terms\\s+from)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.terms.applescript',
          patterns: [{include: '$self'}]
        },
        {
          begin: '^\\s*(with\\s+timeout(\\s+of)?)\\b',
          beginCaptures: {1: {name: 'keyword.control.timeout.applescript'}},
          end: '^\\s*(end(?:\\s+timeout)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.timeout.applescript',
          patterns: [{include: '$self'}]
        },
        {
          begin: '^\\s*(with\\s+transaction(\\s+of)?)\\b',
          beginCaptures: {1: {name: 'keyword.control.transaction.applescript'}},
          end: '^\\s*(end(?:\\s+transaction)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.transaction.applescript',
          patterns: [{include: '$self'}]
        }
      ]
    },
    'blocks.repeat': {
      patterns: [
        {
          begin: '^\\s*(repeat)\\s+(until)\\b',
          beginCaptures: {
            1: {name: 'keyword.control.repeat.applescript'},
            2: {name: 'keyword.control.until.applescript'}
          },
          end: '^\\s*(end(?:\\s+repeat)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.repeat.until.applescript',
          patterns: [{include: '$self'}]
        },
        {
          begin: '^\\s*(repeat)\\s+(while)\\b',
          beginCaptures: {
            1: {name: 'keyword.control.repeat.applescript'},
            2: {name: 'keyword.control.while.applescript'}
          },
          end: '^\\s*(end(?:\\s+repeat)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.repeat.while.applescript',
          patterns: [{include: '$self'}]
        },
        {
          begin: '^\\s*(repeat)\\s+(with)\\s+(\\w+)\\b',
          beginCaptures: {
            1: {name: 'keyword.control.repeat.applescript'},
            2: {name: 'keyword.control.until.applescript'},
            3: {name: 'variable.parameter.loop.applescript'}
          },
          end: '^\\s*(end(?:\\s+repeat)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.repeat.with.applescript',
          patterns: [
            {
              match: '\\b(from|to|by)\\b',
              name: 'keyword.control.modifier.range.applescript'
            },
            {
              match: '\\b(in)\\b',
              name: 'keyword.control.modifier.list.applescript'
            },
            {include: '$self'}
          ]
        },
        {
          begin: '^\\s*(repeat)\\b(?=\\s*(--.*?)?$)',
          beginCaptures: {1: {name: 'keyword.control.repeat.applescript'}},
          end: '^\\s*(end(?:\\s+repeat)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.repeat.forever.applescript',
          patterns: [{include: '$self'}]
        },
        {
          begin: '^\\s*(repeat)\\b',
          beginCaptures: {1: {name: 'keyword.control.repeat.applescript'}},
          end: '^\\s*(end(?:\\s+repeat)?)(?=\\s*(--.*?)?$)',
          endCaptures: {1: {name: 'keyword.control.end.applescript'}},
          name: 'meta.block.repeat.times.applescript',
          patterns: [
            {match: '\\b(times)\\b', name: 'keyword.control.times.applescript'},
            {include: '$self'}
          ]
        }
      ]
    },
    'blocks.statement': {
      patterns: [
        {
          begin: '\\b(prop(?:erty)?)\\s+(\\w+)\\b',
          beginCaptures: {
            1: {name: 'keyword.control.def.property.applescript'},
            2: {name: 'variable.other.property.applescript'}
          },
          end: '(?<!¬)$',
          name: 'meta.statement.property.applescript',
          patterns: [
            {
              match: ':',
              name: 'punctuation.separator.key-value.property.applescript'
            },
            {include: '#inline'}
          ]
        },
        {
          begin: '\\b(set)\\s+(\\w+)\\s+(to)\\b',
          beginCaptures: {
            1: {name: 'keyword.control.def.set.applescript'},
            2: {name: 'variable.other.readwrite.set.applescript'},
            3: {name: 'keyword.control.def.set.applescript'}
          },
          end: '(?<!¬)$',
          name: 'meta.statement.set.applescript',
          patterns: [{include: '#inline'}]
        },
        {
          begin: '\\b(local)\\b',
          beginCaptures: {1: {name: 'keyword.control.def.local.applescript'}},
          end: '(?<!¬)$',
          name: 'meta.statement.local.applescript',
          patterns: [
            {
              match: ',',
              name: 'punctuation.separator.variables.local.applescript'
            },
            {
              match: '\\b\\w+',
              name: 'variable.other.readwrite.local.applescript'
            },
            {include: '#inline'}
          ]
        },
        {
          begin: '\\b(global)\\b',
          beginCaptures: {1: {name: 'keyword.control.def.global.applescript'}},
          end: '(?<!¬)$',
          name: 'meta.statement.global.applescript',
          patterns: [
            {
              match: ',',
              name: 'punctuation.separator.variables.global.applescript'
            },
            {
              match: '\\b\\w+',
              name: 'variable.other.readwrite.global.applescript'
            },
            {include: '#inline'}
          ]
        },
        {
          begin: '\\b(error)\\b',
          beginCaptures: {
            1: {name: 'keyword.control.exception.error.applescript'}
          },
          end: '(?<!¬)$',
          name: 'meta.statement.error.applescript',
          patterns: [
            {
              match: '\\b(number|partial|from|to)\\b',
              name: 'keyword.control.exception.modifier.applescript'
            },
            {include: '#inline'}
          ]
        },
        {
          begin: '\\b(if)\\b(?=.*\\bthen\\b(?!\\s*(--.*?)?$))',
          beginCaptures: {1: {name: 'keyword.control.if.applescript'}},
          end: '(?<!¬)$',
          name: 'meta.statement.if-then.applescript',
          patterns: [{include: '#inline'}]
        }
      ]
    },
    'blocks.tell': {
      patterns: [
        {
          begin:
            '^\\s*(tell)\\s+(?=app(lication)?\\s+"(?i:textmate)")(?!.*\\bto(?!\\s+tell)\\b)',
          captures: {1: {name: 'keyword.control.tell.applescript'}},
          end: '^\\s*(end(?:\\s+tell)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.tell.application.textmate.applescript',
          patterns: [
            {include: '#textmate'},
            {include: '#standard-suite'},
            {include: '$self'}
          ]
        },
        {
          begin:
            '^\\s*(tell)\\s+(?=app(lication)?\\s+"(?i:finder)")(?!.*\\bto(?!\\s+tell)\\b)',
          captures: {1: {name: 'keyword.control.tell.applescript'}},
          end: '^\\s*(end(?:\\s+tell)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.tell.application.finder.applescript',
          patterns: [
            {include: '#finder'},
            {include: '#standard-suite'},
            {include: '$self'}
          ]
        },
        {
          begin:
            '^\\s*(tell)\\s+(?=app(lication)?\\s+"(?i:system events)")(?!.*\\bto(?!\\s+tell)\\b)',
          captures: {1: {name: 'keyword.control.tell.applescript'}},
          end: '^\\s*(end(?:\\s+tell)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.tell.application.system-events.applescript',
          patterns: [
            {include: '#system-events'},
            {include: '#standard-suite'},
            {include: '$self'}
          ]
        },
        {
          begin:
            '^\\s*(tell)\\s+(?=app(lication)?\\s+"(?i:itunes)")(?!.*\\bto(?!\\s+tell)\\b)',
          captures: {1: {name: 'keyword.control.tell.applescript'}},
          end: '^\\s*(end(?:\\s+tell)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.tell.application.itunes.applescript',
          patterns: [
            {include: '#itunes'},
            {include: '#standard-suite'},
            {include: '$self'}
          ]
        },
        {
          begin:
            '^\\s*(tell)\\s+(?=app(lication)?\\s+process\\b)(?!.*\\bto(?!\\s+tell)\\b)',
          captures: {1: {name: 'keyword.control.tell.applescript'}},
          end: '^\\s*(end(?:\\s+tell)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.tell.application-process.generic.applescript',
          patterns: [{include: '#standard-suite'}, {include: '$self'}]
        },
        {
          begin:
            '^\\s*(tell)\\s+(?=app(lication)?\\b)(?!.*\\bto(?!\\s+tell)\\b)',
          captures: {1: {name: 'keyword.control.tell.applescript'}},
          end: '^\\s*(end(?:\\s+tell)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.tell.application.generic.applescript',
          patterns: [{include: '#standard-suite'}, {include: '$self'}]
        },
        {
          begin: '^\\s*(tell)\\s+(?!.*\\bto(?!\\s+tell)\\b)',
          captures: {1: {name: 'keyword.control.tell.applescript'}},
          end: '^\\s*(end(?:\\s+tell)?)(?=\\s*(--.*?)?$)',
          name: 'meta.block.tell.generic.applescript',
          patterns: [{include: '$self'}]
        },
        {
          begin: '^\\s*(tell)\\s+(?=.*\\bto\\b)',
          captures: {1: {name: 'keyword.control.tell.applescript'}},
          end: '(?<!¬)$',
          name: 'meta.block.tell.generic.applescript',
          patterns: [{include: '$self'}]
        }
      ]
    },
    'built-in': {
      patterns: [
        {include: '#built-in.constant'},
        {include: '#built-in.keyword'},
        {include: '#built-in.support'},
        {include: '#built-in.punctuation'}
      ]
    },
    'built-in.constant': {
      patterns: [
        {
          match: '\\b(?i:true|false|yes|no)\\b',
          name: 'constant.language.boolean.applescript'
        },
        {
          match: '\\b(?i:null|missing\\s+value)\\b',
          name: 'constant.language.null.applescript'
        },
        {
          match: '-?\\b\\d+((\\.(\\d+\\b)?)?(?i:e\\+?\\d*\\b)?|\\b)',
          name: 'constant.numeric.applescript'
        },
        {
          match: '\\b(?i:space|tab|return|linefeed|quote)\\b',
          name: 'constant.other.text.applescript'
        },
        {
          match:
            '\\b(?i:all\\s+(caps|lowercase)|bold|condensed|expanded|hidden|italic|outline|plain|shadow|small\\s+caps|strikethrough|(sub|super)script|underline)\\b',
          name: 'constant.other.styles.applescript'
        },
        {
          match:
            '\\b(?i:Jan(uary)?|Feb(ruary)?|Mar(ch)?|Apr(il)?|May|Jun(e)?|Jul(y)?|Aug(ust)?|Sep(tember)?|Oct(ober)?|Nov(ember)?|Dec(ember)?)\\b',
          name: 'constant.other.time.month.applescript'
        },
        {
          match:
            '\\b(?i:Mon(day)?|Tue(sday)?|Wed(nesday)?|Thu(rsday)?|Fri(day)?|Sat(urday)?|Sun(day)?)\\b',
          name: 'constant.other.time.weekday.applescript'
        },
        {
          match:
            '\\b(?i:AppleScript|pi|result|version|current\\s+application|its?|m[ey])\\b',
          name: 'constant.other.miscellaneous.applescript'
        },
        {
          match:
            '\\b(?i:text\\s+item\\s+delimiters|print\\s+(length|depth))\\b',
          name: 'variable.language.applescript'
        }
      ]
    },
    'built-in.keyword': {
      patterns: [
        {
          match: '(&|\\*|\\+|-|/|÷|\\^)',
          name: 'keyword.operator.arithmetic.applescript'
        },
        {
          match: '(=|≠|>|<|≥|>=|≤|<=)',
          name: 'keyword.operator.comparison.applescript'
        },
        {
          match:
            '(?ix)\\b\n\t\t\t\t\t\t(and|or|div|mod|as|not\n\t\t\t\t\t\t|(a\\s+)?(ref(\\s+to)?|reference\\s+to)\n\t\t\t\t\t\t|equal(s|\\s+to)|contains?|comes\\s+(after|before)|(start|begin|end)s?\\s+with\n\t\t\t\t\t\t)\n\t\t\t\t\t\\b',
          name: 'keyword.operator.word.applescript'
        },
        {
          match:
            "(?ix)\\b\n\t\t\t\t\t\t(is(n't|\\s+not)?(\\s+(equal(\\s+to)?|(less|greater)\\s+than(\\s+or\\s+equal(\\s+to)?)?|in|contained\\s+by))?\n\t\t\t\t\t\t|does(n't|\\s+not)\\s+(equal|come\\s+(before|after)|contain)\n\t\t\t\t\t\t)\n\t\t\t\t\t\\b",
          name: 'keyword.operator.word.applescript'
        },
        {
          match:
            '\\b(?i:some|every|whose|where|that|id|index|\\d+(st|nd|rd|th)|first|second|third|fourth|fifth|sixth|seventh|eighth|ninth|tenth|last|front|back|middle|named|beginning|end|from|to|thr(u|ough)|before|(front|back|beginning|end)\\s+of|after|behind|in\\s+(front|back|beginning|end)\\s+of)\\b',
          name: 'keyword.operator.reference.applescript'
        },
        {
          match: '\\b(?i:continue|return|exit(\\s+repeat)?)\\b',
          name: 'keyword.control.loop.applescript'
        },
        {
          match:
            '\\b(?i:about|above|after|against|and|apart\\s+from|around|as|aside\\s+from|at|back|before|beginning|behind|below|beneath|beside|between|but|by|considering|contain|contains|contains|copy|div|does|eighth|else|end|equal|equals|error|every|false|fifth|first|for|fourth|from|front|get|given|global|if|ignoring|in|instead\\s+of|into|is|it|its|last|local|me|middle|mod|my|ninth|not|of|on|onto|or|out\\s+of|over|prop|property|put|ref|reference|repeat|returning|script|second|set|seventh|since|sixth|some|tell|tenth|that|the|then|third|through|thru|timeout|times|to|transaction|true|try|until|where|while|whose|with|without)\\b',
          name: 'keyword.other.applescript'
        }
      ]
    },
    'built-in.punctuation': {
      patterns: [
        {
          match: '¬',
          name: 'punctuation.separator.continuation.line.applescript'
        },
        {
          match: ':',
          name: 'punctuation.separator.key-value.property.applescript'
        },
        {match: '[()]', name: 'punctuation.section.group.applescript'}
      ]
    },
    'built-in.support': {
      patterns: [
        {
          match:
            '\\b(?i:POSIX\\s+path|frontmost|id|name|running|version|days?|weekdays?|months?|years?|time|date\\s+string|time\\s+string|length|rest|reverse|items?|contents|quoted\\s+form|characters?|paragraphs?|words?)\\b',
          name: 'support.function.built-in.property.applescript'
        },
        {
          match:
            '\\b(?i:activate|log|clipboard\\s+info|set\\s+the\\s+clipboard\\s+to|the\\s+clipboard|info\\s+for|list\\s+(disks|folder)|mount\\s+volume|path\\s+to(\\s+resource)?|close\\s+access|get\\s+eof|open\\s+for\\s+access|read|set\\s+eof|write|open\\s+location|current\\s+date|do\\s+shell\\s+script|get\\s+volume\\s+settings|random\\s+number|round|set\\s+volume|system\\s+(attribute|info)|time\\s+to\\s+GMT|load\\s+script|run\\s+script|scripting\\s+components|store\\s+script|copy|count|get|launch|run|set|ASCII\\s+(character|number)|localized\\s+string|offset|summarize|beep|choose\\s+(application|color|file(\\s+name)?|folder|from\\s+list|remote\\s+application|URL)|delay|display\\s+(alert|dialog)|say)\\b',
          name: 'support.function.built-in.command.applescript'
        },
        {
          match: '\\b(?i:get|run)\\b',
          name: 'support.function.built-in.applescript'
        },
        {
          match: '\\b(?i:anything|data|text|upper\\s+case|propert(y|ies))\\b',
          name: 'support.class.built-in.applescript'
        },
        {
          match: '\\b(?i:alias|class)(es)?\\b',
          name: 'support.class.built-in.applescript'
        },
        {
          match:
            '\\b(?i:app(lication)?|boolean|character|constant|date|event|file(\\s+specification)?|handler|integer|item|keystroke|linked\\s+list|list|machine|number|picture|preposition|POSIX\\s+file|real|record|reference(\\s+form)?|RGB\\s+color|script|sound|text\\s+item|type\\s+class|vector|writing\\s+code(\\s+info)?|zone|((international|styled(\\s+(Clipboard|Unicode))?|Unicode)\\s+)?text|((C|encoded|Pascal)\\s+)?string)s?\\b',
          name: 'support.class.built-in.applescript'
        },
        {
          match:
            '(?ix)\\b\n\t\t\t\t\t\t(\t(cubic\\s+(centi)?|square\\s+(kilo)?|centi|kilo)met(er|re)s\n\t\t\t\t\t\t|\tsquare\\s+(yards|feet|miles)|cubic\\s+(yards|feet|inches)|miles|inches\n\t\t\t\t\t\t|\tlit(re|er)s|gallons|quarts\n\t\t\t\t\t\t|\t(kilo)?grams|ounces|pounds\n\t\t\t\t\t\t|\tdegrees\\s+(Celsius|Fahrenheit|Kelvin)\n\t\t\t\t\t\t)\n\t\t\t\t\t\\b',
          name: 'support.class.built-in.unit.applescript'
        },
        {
          match: '\\b(?i:seconds|minutes|hours|days)\\b',
          name: 'support.class.built-in.time.applescript'
        }
      ]
    },
    comments: {
      patterns: [
        {
          begin: '^\\s*(#!)',
          captures: {1: {name: 'punctuation.definition.comment.applescript'}},
          end: '\\n',
          name: 'comment.line.number-sign.applescript'
        },
        {
          begin: '(^[ \\t]+)?(?=#)',
          beginCaptures: {
            1: {name: 'punctuation.whitespace.comment.leading.applescript'}
          },
          end: '(?!\\G)',
          patterns: [
            {
              begin: '#',
              beginCaptures: {
                0: {name: 'punctuation.definition.comment.applescript'}
              },
              end: '\\n',
              name: 'comment.line.number-sign.applescript'
            }
          ]
        },
        {
          begin: '(^[ \\t]+)?(?=--)',
          beginCaptures: {
            1: {name: 'punctuation.whitespace.comment.leading.applescript'}
          },
          end: '(?!\\G)',
          patterns: [
            {
              begin: '--',
              beginCaptures: {
                0: {name: 'punctuation.definition.comment.applescript'}
              },
              end: '\\n',
              name: 'comment.line.double-dash.applescript'
            }
          ]
        },
        {
          begin: '\\(\\*',
          captures: {0: {name: 'punctuation.definition.comment.applescript'}},
          end: '\\*\\)',
          name: 'comment.block.applescript',
          patterns: [{include: '#comments.nested'}]
        }
      ]
    },
    'comments.nested': {
      patterns: [
        {
          begin: '\\(\\*',
          beginCaptures: {
            0: {name: 'punctuation.definition.comment.begin.applescript'}
          },
          end: '\\*\\)',
          endCaptures: {
            0: {name: 'punctuation.definition.comment.end.applescript'}
          },
          name: 'comment.block.applescript',
          patterns: [{include: '#comments.nested'}]
        }
      ]
    },
    'data-structures': {
      patterns: [
        {
          begin: '\\{',
          beginCaptures: {
            0: {name: 'punctuation.definition.array.begin.applescript'}
          },
          end: '\\}',
          endCaptures: {
            0: {name: 'punctuation.definition.array.end.applescript'}
          },
          name: 'meta.array.applescript',
          patterns: [
            {
              captures: {
                1: {name: 'constant.other.key.applescript'},
                2: {name: 'meta.identifier.applescript'},
                3: {name: 'punctuation.definition.identifier.applescript'},
                4: {name: 'punctuation.definition.identifier.applescript'},
                5: {name: 'punctuation.separator.key-value.applescript'}
              },
              match: '(\\w+|((\\|)[^|\\n]*(\\|)))\\s*(:)'
            },
            {match: ':', name: 'punctuation.separator.key-value.applescript'},
            {match: ',', name: 'punctuation.separator.array.applescript'},
            {include: '#inline'}
          ]
        },
        {
          begin: '(?:(?<=application )|(?<=app ))(")',
          captures: {1: {name: 'punctuation.definition.string.applescript'}},
          end: '(")',
          name: 'string.quoted.double.application-name.applescript',
          patterns: [
            {match: '\\\\.', name: 'constant.character.escape.applescript'}
          ]
        },
        {
          begin: '(")',
          captures: {1: {name: 'punctuation.definition.string.applescript'}},
          end: '(")',
          name: 'string.quoted.double.applescript',
          patterns: [
            {match: '\\\\.', name: 'constant.character.escape.applescript'}
          ]
        },
        {
          captures: {
            1: {name: 'punctuation.definition.identifier.applescript'},
            2: {name: 'punctuation.definition.identifier.applescript'}
          },
          match: '(\\|)[^|\\n]*(\\|)',
          name: 'meta.identifier.applescript'
        },
        {
          captures: {
            1: {name: 'punctuation.definition.data.applescript'},
            2: {name: 'support.class.built-in.applescript'},
            3: {name: 'storage.type.utxt.applescript'},
            4: {name: 'string.unquoted.data.applescript'},
            5: {name: 'punctuation.definition.data.applescript'},
            6: {name: 'keyword.operator.applescript'},
            7: {name: 'support.class.built-in.applescript'}
          },
          match:
            '(«)(data) (utxt|utf8)([[:xdigit:]]*)(»)(?:\\s+(as)\\s+(?i:Unicode\\s+text))?',
          name: 'constant.other.data.utxt.applescript'
        },
        {
          begin: '(«)(\\w+)\\b(?=\\s)',
          beginCaptures: {
            1: {name: 'punctuation.definition.data.applescript'},
            2: {name: 'support.class.built-in.applescript'}
          },
          end: '(»)',
          endCaptures: {1: {name: 'punctuation.definition.data.applescript'}},
          name: 'constant.other.data.raw.applescript'
        },
        {
          captures: {
            1: {name: 'punctuation.definition.data.applescript'},
            2: {name: 'punctuation.definition.data.applescript'}
          },
          match: '(«)[^»]*(»)',
          name: 'invalid.illegal.data.applescript'
        }
      ]
    },
    finder: {
      patterns: [
        {
          match:
            '\\b(item|container|(computer|disk|trash)-object|disk|folder|((alias|application|document|internet location) )?file|clipping|package)s?\\b',
          name: 'support.class.finder.items.applescript'
        },
        {
          match:
            '\\b((Finder|desktop|information|preferences|clipping) )windows?\\b',
          name: 'support.class.finder.window-classes.applescript'
        },
        {
          match:
            '\\b(preferences|(icon|column|list) view options|(label|column|alias list)s?)\\b',
          name: 'support.class.finder.type-definitions.applescript'
        },
        {
          match:
            '\\b(copy|find|sort|clean up|eject|empty( trash)|erase|reveal|update)\\b',
          name: 'support.function.finder.items.applescript'
        },
        {
          match:
            '\\b(insertion location|product version|startup disk|desktop|trash|home|computer container|finder preferences)\\b',
          name: 'support.constant.finder.applescript'
        },
        {match: '\\b(visible)\\b', name: 'support.variable.finder.applescript'}
      ]
    },
    inline: {
      patterns: [
        {include: '#comments'},
        {include: '#data-structures'},
        {include: '#built-in'},
        {include: '#standardadditions'}
      ]
    },
    itunes: {
      patterns: [
        {
          match:
            '\\b(artwork|application|encoder|EQ preset|item|source|visual|(EQ |browser )?window|((audio CD|device|shared|URL|file) )?track|playlist window|((audio CD|device|radio tuner|library|folder|user) )?playlist)s?\\b',
          name: 'support.class.itunes.applescript'
        },
        {
          match:
            '\\b(add|back track|convert|fast forward|(next|previous) track|pause|play(pause)?|refresh|resume|rewind|search|stop|update|eject|subscribe|update(Podcast|AllPodcasts)|download)\\b',
          name: 'support.function.itunes.applescript'
        },
        {
          match:
            '\\b(current (playlist|stream (title|URL)|track)|player state)\\b',
          name: 'support.constant.itunes.applescript'
        },
        {
          match:
            '\\b(current (encoder|EQ preset|visual)|EQ enabled|fixed indexing|full screen|mute|player position|sound volume|visuals enabled|visual size)\\b',
          name: 'support.variable.itunes.applescript'
        }
      ]
    },
    'standard-suite': {
      patterns: [
        {
          match: '\\b(colors?|documents?|items?|windows?)\\b',
          name: 'support.class.standard-suite.applescript'
        },
        {
          match:
            '\\b(close|count|delete|duplicate|exists|make|move|open|print|quit|save|activate|select|data size)\\b',
          name: 'support.function.standard-suite.applescript'
        },
        {
          match: '\\b(name|frontmost|version)\\b',
          name: 'support.constant.standard-suite.applescript'
        },
        {
          match: '\\b(selection)\\b',
          name: 'support.variable.standard-suite.applescript'
        },
        {
          match:
            '\\b(attachments?|attribute runs?|characters?|paragraphs?|texts?|words?)\\b',
          name: 'support.class.text-suite.applescript'
        }
      ]
    },
    standardadditions: {
      patterns: [
        {
          match: '\\b((alert|dialog) reply)\\b',
          name: 'support.class.standardadditions.user-interaction.applescript'
        },
        {
          match: '\\b(file information)\\b',
          name: 'support.class.standardadditions.file.applescript'
        },
        {
          match: '\\b(POSIX files?|system information|volume settings)\\b',
          name: 'support.class.standardadditions.miscellaneous.applescript'
        },
        {
          match: '\\b(URLs?|internet address(es)?|web pages?|FTP items?)\\b',
          name: 'support.class.standardadditions.internet.applescript'
        },
        {
          match:
            '\\b(info for|list (disks|folder)|mount volume|path to( resource)?)\\b',
          name: 'support.function.standardadditions.file.applescript'
        },
        {
          match:
            '\\b(beep|choose (application|color|file( name)?|folder|from list|remote application|URL)|delay|display (alert|dialog)|say)\\b',
          name: 'support.function.standardadditions.user-interaction.applescript'
        },
        {
          match:
            '\\b(ASCII (character|number)|localized string|offset|summarize)\\b',
          name: 'support.function.standardadditions.string.applescript'
        },
        {
          match: '\\b(set the clipboard to|the clipboard|clipboard info)\\b',
          name: 'support.function.standardadditions.clipboard.applescript'
        },
        {
          match:
            '\\b(open for access|close access|read|write|get eof|set eof)\\b',
          name: 'support.function.standardadditions.file-i-o.applescript'
        },
        {
          match: '\\b((load|store|run) script|scripting components)\\b',
          name: 'support.function.standardadditions.scripting.applescript'
        },
        {
          match:
            '\\b(current date|do shell script|get volume settings|random number|round|set volume|system attribute|system info|time to GMT)\\b',
          name: 'support.function.standardadditions.miscellaneous.applescript'
        },
        {
          match:
            '\\b(opening folder|(closing|moving) folder window for|adding folder items to|removing folder items from)\\b',
          name: 'support.function.standardadditions.folder-actions.applescript'
        },
        {
          match: '\\b(open location|handle CGI request)\\b',
          name: 'support.function.standardadditions.internet.applescript'
        }
      ]
    },
    'system-events': {
      patterns: [
        {
          match: '\\b(audio (data|file))\\b',
          name: 'support.class.system-events.audio-file.applescript'
        },
        {
          match:
            '\\b(alias(es)?|(Classic|local|network|system|user) domain objects?|disk( item)?s?|domains?|file( package)?s?|folders?|items?)\\b',
          name: 'support.class.system-events.disk-folder-file.applescript'
        },
        {
          match: '\\b(delete|open|move)\\b',
          name: 'support.function.system-events.disk-folder-file.applescript'
        },
        {
          match: '\\b(folder actions?|scripts?)\\b',
          name: 'support.class.system-events.folder-actions.applescript'
        },
        {
          match:
            '\\b(attach action to|attached scripts|edit action of|remove action from)\\b',
          name: 'support.function.system-events.folder-actions.applescript'
        },
        {
          match: '\\b(movie data|movie file)\\b',
          name: 'support.class.system-events.movie-file.applescript'
        },
        {
          match: '\\b(log out|restart|shut down|sleep)\\b',
          name: 'support.function.system-events.power.applescript'
        },
        {
          match:
            '\\b(((application |desk accessory )?process|(check|combo )?box)(es)?|(action|attribute|browser|(busy|progress|relevance) indicator|color well|column|drawer|group|grow area|image|incrementor|list|menu( bar)?( item)?|(menu |pop up |radio )?button|outline|(radio|tab|splitter) group|row|scroll (area|bar)|sheet|slider|splitter|static text|table|text (area|field)|tool bar|UI element|window)s?)\\b',
          name: 'support.class.system-events.processes.applescript'
        },
        {
          match: '\\b(click|key code|keystroke|perform|select)\\b',
          name: 'support.function.system-events.processes.applescript'
        },
        {
          match: '\\b(property list (file|item))\\b',
          name: 'support.class.system-events.property-list.applescript'
        },
        {
          match: '\\b(annotation|QuickTime (data|file)|track)s?\\b',
          name: 'support.class.system-events.quicktime-file.applescript'
        },
        {
          match: '\\b((abort|begin|end) transaction)\\b',
          name: 'support.function.system-events.system-events.applescript'
        },
        {
          match: '\\b(XML (attribute|data|element|file)s?)\\b',
          name: 'support.class.system-events.xml.applescript'
        },
        {
          match: '\\b(print settings|users?|login items?)\\b',
          name: 'support.class.sytem-events.other.applescript'
        }
      ]
    },
    textmate: {
      patterns: [
        {
          match: '\\b(print settings)\\b',
          name: 'support.class.textmate.applescript'
        },
        {
          match: '\\b(get url|insert|reload bundles)\\b',
          name: 'support.function.textmate.applescript'
        }
      ]
    }
  },
  scopeName: 'source.applescript'
}

export default grammar
